package com.yeqifu.bus.controller;


import cn.hutool.db.sql.Order;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yeqifu.bus.entity.Goods;
import com.yeqifu.bus.entity.Inport;
import com.yeqifu.bus.entity.Provider;
import com.yeqifu.bus.mapper.InportMapper;
import com.yeqifu.bus.service.IGoodsService;
import com.yeqifu.bus.service.IInportService;
import com.yeqifu.bus.service.IProviderService;
import com.yeqifu.bus.vo.InportVo;
import com.yeqifu.sys.common.DataGridView;
import com.yeqifu.sys.common.ResultObj;
import com.yeqifu.sys.common.WebUtils;
import com.yeqifu.sys.entity.Dept;
import com.yeqifu.sys.entity.Shelf;
import com.yeqifu.sys.entity.User;
import com.yeqifu.sys.mapper.RoleMapper;
import com.yeqifu.sys.service.IDeptService;
import com.yeqifu.sys.service.IRoleService;
import com.yeqifu.sys.service.IShelfService;
import com.yeqifu.sys.service.IUserService;
import io.swagger.models.auth.In;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.xml.transform.Result;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * InnoDB free: 9216 kB; (`providerid`) REFER `warehouse/bus_provider`(`id`); (`goo 前端控制器
 * </p>
 *
 * @author 艾琦-
 * @since 2020-12-27
 */
@RestController
@AllArgsConstructor
@RequestMapping("inport")
public class InportController {


    IInportService inportService;
    IProviderService providerService;
    IGoodsService goodsService;
    IDeptService deptService;
    IUserService userService;
    IShelfService shelfService;
    IRoleService roleService;
    InportMapper inportMapper;

    /**
     * 业务管理员、仓库管理员只能查询自己仓库的进货订单
     * @param inportVo
     * @return
     */
    @RequestMapping("loadAllInport")
    public DataGridView loadWareInport(InportVo inportVo){
        //1.先通过session获得当前用户的ID
        User user =(User) WebUtils.getSession().getAttribute("user");
        Integer userId = user.getId();
        User user1 = userService.getById(userId);

        IPage<Inport> page = new Page<Inport>(inportVo.getPage(),inportVo.getLimit());
        QueryWrapper<Inport> queryWrapper = new QueryWrapper<Inport>();

        // 看有没有父类
        Dept testdept = deptService.getById(user1.getDeptid());
        // 如果是子级
        if (testdept.getPid() != 0)
            queryWrapper.eq("ware_house_name",user1.getDeptid()).or().eq("ware_house_p_name",user1.getDeptid());

        //对供应商进行查询
        queryWrapper.eq(inportVo.getProviderid()!=null&&inportVo.getProviderid()!=0,"providerid",inportVo.getProviderid());
        //对商品进行查询
        queryWrapper.eq(inportVo.getGoodsid()!=null&&inportVo.getGoodsid()!=0,"goodsid",inportVo.getGoodsid());
        //对时间进行查询要求大于开始时间小于结束时间
        queryWrapper.ge(inportVo.getStartTime()!=null,"inporttime",inportVo.getStartTime());
        queryWrapper.le(inportVo.getEndTime()!=null,"inporttime",inportVo.getEndTime());
        //通过进货时间对商品进行排序
        queryWrapper.orderByDesc("inporttime");
        // 查询分页结果
        IPage<Inport> page1 = inportService.page(page, queryWrapper);
        List<Inport> records = page1.getRecords();
        for (Inport inport : records) {
            Provider provider = providerService.getById(inport.getProviderid());
            if (provider!=null){
                //设置供应商姓名
                inport.setProvidername(provider.getProvidername());
            }
            Goods goods = goodsService.getById(inport.getGoodsid());
            if (goods!=null){
                // 设置商品名称
                inport.setGoodsname(goods.getGoodsname());
                // 设置商品规格
                inport.setSize(goods.getSize());
                // 设置商品类型
                inport.setType(goods.getType());
            }
            Dept pdept = deptService.getById(inport.getWareHousePName());
            Dept dept = deptService.getById(inport.getWareHouseName());
            if (pdept!=null) {
                // 设置仓库地区
                inport.setWareHousePID(pdept.getName());
            }
            if (dept!=null) {
                // 设置仓库名称
                inport.setWareHouseID(dept.getName());
            }
            //查询货架剩余容量
            //剩余容量算法：goods.getType()，根据商品类型、仓库名称找到货架列表，在计算这些货架的数量
            //查询总数量,同种类型货架
//            QueryWrapper<Shelf> shelfWrapper = new QueryWrapper<>();
//            shelfWrapper
//                    .eq("wmsid",inport.getWareHouseName())
//                    .eq("type",goods.getType())
//                    .select("sum(total) as totalCapacity");
//            Shelf shelf = shelfService.getOne(shelfWrapper);
//            System.out.println(goods.getType()+"__"+"__"+inport.getWareHouseName()+"__"+shelf+"-------");
        }
        return new DataGridView(page1.getTotal(),page1.getRecords());
    }


    /**
     * 添加进货商品，此操作是业务管理员操作的，并没有实际入库,不会更新商品表
     * @param inportVo
     * @return
     */
    @RequestMapping("addInport")
    public ResultObj addInport(InportVo inportVo) {
        try {
            //获得当前系统用户
            User user = (User) WebUtils.getSession().getAttribute("user");
            //设置操作人
            inportVo.setOperateperson(user.getName());
            //设置进货时间
            inportVo.setInporttime(new Date());
            // 修改商品进货表，还没有真正入库
            if (inportService.save(inportVo))
                return ResultObj.ADD_SUCCESS;
        } catch (Exception e) {
            e.printStackTrace();
            return ResultObj.ADD_ERROR;
        }
        return ResultObj.ADD_ERROR;
    }

    /**
     * 仓库实际添加货物，此操作是仓库管理员操作的，实际入库，更新各种表
     * 说明：
     * 1、入库后，将订单状态设置为已完成
     * 2、添加商品信息到 bus_goods 表
     * 3、添加商品保质期信息到 bus_goods_date 表
     * 4、修改对应货架的数量
     *
     * @param inportVo
     * @return
     */
    @RequestMapping("realAddInport")
    public ResultObj realAddInport(InportVo inportVo) {
        try {
            if (inportService.realSave(inportVo))
                return ResultObj.REALADD_SUCCESS;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return ResultObj.REALADD_ERROR;
    }

    /**
     * 业务管理员更新进货商品
     * @param inportVo
     * @return
     */
    // 业务管理员修改入库单，只能修改“未处理”的订单
    @RequestMapping("updateInport")
    public ResultObj updateInport(InportVo inportVo){
        try {
            if (inportService.updateById(inportVo))
                return ResultObj.UPDATE_SUCCESS;
        } catch (Exception e) {
            e.printStackTrace();
            return ResultObj.UPDATE_ERROR;
        }
        return ResultObj.UPDATE_ERROR;
    }


    /**
     * 仓库管理员分配货架
     * @param inportVo
     * @return
     */
    // 业务管理员分配货架
    @RequestMapping("updateShelf")
    public ResultObj updateShelf(InportVo inportVo){
        try {
            if (inportService.saveShelf(inportVo))
                return ResultObj.UPDATESHELF_SUCCESS;
        } catch (Exception e) {
            e.printStackTrace();
            return ResultObj.UPDATESHELF_ERROR;
        }
        return ResultObj.UPDATE_ERROR;
    }

    /**
     * 删除进货商品
     * @param id
     * @return
     */
    @RequestMapping("deleteInport")
    public ResultObj deleteInport(Integer id){
        try {
            inportService.removeById(id);
            return ResultObj.DELETE_SUCCESS;
        } catch (Exception e) {
            e.printStackTrace();
            return ResultObj.DELETE_ERROR;
        }
    }

    /**
     * 撤回订单/退回订单，
     * 业务管理员 撤回订单只能撤回状态为 0 的订单
     * 仓库管理员 退回订单，可以退回状态为 1 或 0 的订单
     * */
    @RequestMapping("backInport")
    public ResultObj backInport(Integer id,@RequestParam int type){
        try {
            // 得到此条信息
            Inport inport = inportService.getById(id);
            if (type == 0)
                inport.setStatus(4);
            else if (type == 1)
                inport.setStatus(3);
            if (inportService.recallById(inport,type))
                return ResultObj.RECALLINPORT_SUCCESS;
        } catch (Exception e) {
            e.printStackTrace();
            return ResultObj.RECALLINPORT_ERROR_2;
        }
        return ResultObj.RECALLINPORT_ERROR_1;
    }
}

